﻿using BAL;
using DAL;
using DAL.DataTransferObject;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Data.SqlClient;
using System.Drawing;
using System.Text;
using System.Windows.Forms;

namespace Module.QLNhanVien
{
    public partial class frmQLNhanVien : Form
    {
        public frmQLNhanVien()
        {
            InitializeComponent();
        }

        NhanVienBAO nvBAO = new NhanVienBAO();
        Timer timer = new Timer();
        private void frmQLNhanVien_Load(object sender, EventArgs e)
        {
            btnReset.PerformClick();

            timer.Interval = 10;
            timer.Tick += timer_Tick;
            timer.Start();
        }

        void timer_Tick(object sender, EventArgs e)
        {
            btnReset.PerformClick();
            timer.Stop();
        }

        private void dgvNhanVien_CellContentClick(object sender, DataGridViewCellEventArgs e)
        {

        }

        private void dgvClicked(object sender, EventArgs e)
        {
            txtPW.ReadOnly = true;
            this.RowToInfor();
        }

        private void RowToInfor()
        {
            if (dgvNhanVien.SelectedRows.Count == 1)
            {
                if (!SearchClicked)
                {
                    int index = dgvNhanVien.SelectedRows[0].Index;
                    txtMaNV.Text = nvBAO.SelectViewAllNhanVien()[index]["MaNV"].ToString();
                    txtTen.Text = nvBAO.SelectViewAllNhanVien()[index]["TenNV"].ToString();
                    txtHoDem.Text = nvBAO.SelectViewAllNhanVien()[index]["HoDemNV"].ToString();
                    txtDiaChi.Text = nvBAO.SelectViewAllNhanVien()[index]["DiaChi"].ToString();
                    txtLevel.Text = nvBAO.SelectViewAllNhanVien()[index]["CapDo"].ToString();
                    txtLuong.Text = nvBAO.SelectViewAllNhanVien()[index]["Luong"].ToString();
                    txtNQL.Text = nvBAO.SelectViewAllNhanVien()[index]["MaNQL"].ToString();
                    //txtPW.Text = nvBAO.SelectViewAllNhanVien()[index]["Password"].ToString();
                    txtPW.Text = "**********";
                    txtSDT.Text = nvBAO.SelectViewAllNhanVien()[index]["SDT"].ToString();
                    cboChucVu.Text = nvBAO.SelectViewAllNhanVien()[index]["ChucVu"].ToString();
                    CboGT.Text = nvBAO.SelectViewAllNhanVien()[index]["GT"].ToString();
                    dtNSDen.Value = dtNgaySinh.Value = Convert.ToDateTime(nvBAO.SelectViewAllNhanVien()[index]["NgaySinh"].ToString());
                    dtNLVDen.Value = dtNgayLV.Value = Convert.ToDateTime(nvBAO.SelectViewAllNhanVien()[index]["NgayLamViec"].ToString());
                    txtAccount.Text = nvBAO.SelectViewAllNhanVien()[index]["Account"].ToString();

                    txtAccount.ReadOnly = txtMaNV.ReadOnly = true;

                }
                else
                {
                    int index = dgvNhanVien.SelectedRows[0].Index;
                    txtMaNV.Text = dgvNhanVien.SelectedRows[0].Cells["MaNV"].Value.ToString();
                    txtTen.Text = dgvNhanVien.Rows[0].Cells["TenNV"].Value.ToString();
                    txtHoDem.Text = dgvNhanVien.Rows[0].Cells["HoDemNV"].Value.ToString();
                    txtDiaChi.Text = dgvNhanVien.Rows[0].Cells["DiaChi"].Value.ToString();
                    txtLevel.Text = dgvNhanVien.Rows[0].Cells["CapDo"].Value.ToString();
                    txtLuong.Text = dgvNhanVien.Rows[0].Cells["Luong"].Value.ToString();
                    txtNQL.Text = dgvNhanVien.Rows[0].Cells["MaNQL"].Value.ToString();
                    txtPW.Text = "**********";
                    txtSDT.Text = dgvNhanVien.Rows[0].Cells["SDT"].Value.ToString();
                    cboChucVu.Text = dgvNhanVien.Rows[0].Cells["ChucVu"].Value.ToString();
                    CboGT.Text = dgvNhanVien.Rows[0].Cells["GT"].Value.ToString();
                    txtAccount.Text = dgvNhanVien.Rows[0].Cells["Account"].Value.ToString();
                    dtNSDen.Value = dtNgaySinh.Value = Convert.ToDateTime(nvBAO.GetNhanVien(txtMaNV.Text)[0]["NgaySinh"].ToString());
                    dtNLVDen.Value = dtNgayLV.Value = Convert.ToDateTime(nvBAO.GetNhanVien(txtMaNV.Text)[0]["NgayLamViec"].ToString());
                    //MessageBox.Show(Convert.ToDateTime(nvBAO.GetNhanVien(txtMaNV.Text)[0]["NgaySinh"].ToString()) + "__" + dtNgaySinh.Value.ToString() + "___" + dtNSDen.Value.ToString());
                }
                btnDelete.Enabled = btnUpdate.Enabled = true;
            }
        }

        private NhanVien InforToNhanVien()
        {
            NhanVien obj = new NhanVien();
            obj.maNV = txtMaNV.Text;
            obj._luong = Convert.ToInt32(txtLuong.Text);
            obj.chucVu = cboChucVu.Text;
            obj.diaChi = txtDiaChi.Text;
            obj.GT = CboGT.Text;
            obj.hoDemNV = txtHoDem.Text;
            obj.tenNV = txtTen.Text;
            obj.maNQL = txtNQL.Text;
            obj.ngayLamViec = dtNgayLV.Value;
            obj.ngaySinh = dtNgaySinh.Value;
            obj.SDT = txtSDT.Text;
            obj._account = txtAccount.Text;
            obj._password = txtPW.Text;
            obj._level = Convert.ToInt32(txtLevel.Text);
            return obj;
        }

        private void bt_addNew_Click(object sender, EventArgs e)
        {
            NhanVien obj = new NhanVien();
            //Console.WriteLine(dgvNhanVien.Rows[dgvNhanVien.Rows.Count - 1].Cells[0].Value.ToString());
            string tmpManv = dgvNhanVien.Rows[dgvNhanVien.Rows.Count - 1].Cells[1].Value.ToString();
            int tmpManvInt = Convert.ToInt32(tmpManv) + 1;
            obj.maNV = tmpManvInt.ToString();
            try
            {
                if (txtHoDem.Text.Length == 0)
                    throw new Exception("Họ đệm của nhân viên không được để trống !");
                if (txtTen.Text.Length == 0)
                    throw new Exception("Tên của nhân viên không được để trống !");
                if (CboGT.Text != "Nam" && CboGT.Text != "Nu")
                    throw new Exception("Bạn phải nhập giới tính từ các lựa chọn !");
                if (DateTime.Now <= dtNgaySinh.Value)
                    throw new Exception("Ngày sinh không hợp lệ!");
                if (txtDiaChi.Text.Length == 0)
                    throw new Exception("Địa chỉ không được để trống !");
                if (txtSDT.Text.Length == 0)
                    throw new Exception("Số điện thoại không được để trống !");
                if (dtNgayLV.Value < dtNgaySinh.Value)
                    throw new Exception("Ngày làm việc không thể nhỏ hơn ngày sinh !");
                if (cboChucVu.Text != "GiamDoc" && cboChucVu.Text != "PhoGiamDoc" && cboChucVu.Text != "ThuNgan")
                    throw new Exception("Bạn phải nhập chức vụ từ danh sách !");
                if (Convert.ToInt32(txtLuong.Text) <= 0)
                    throw new Exception("Giá trị lương nhập vào không hợp lệ, mời bạn nhập lại !");
                if (txtNQL.Text.Length <= 0)
                    throw new Exception("Mã NQL không được để trống !");
                bool flag = false;
                List<NhanVien> listNV = nvBAO.GetListNhanVien();
                foreach (NhanVien item in listNV)
                    //Console.WriteLine(item.maNV);
                    if (item.maNV == txtNQL.Text)
                    {
                        flag = true;
                    }
                if (!flag)
                    throw new Exception("Mã NQL phải có trong danh sách và một nhân viên không thể quản lý chính mình !");
                if (txtPW.Text == "")
                    throw new Exception("Mật khẩu không được để trống !");
                if (Convert.ToInt32(txtLevel.Text) <= 0 || Convert.ToInt32(txtLevel.Text) > 3)
                    throw new Exception("Cấp độ không hợp lệ, yêu cầu nhập số nhỏ hơn hoặc bằng 3 !");
                obj = this.InforToNhanVien();
                nvBAO.InsertNhanVien(obj);
                btnReset.PerformClick();

            }
            catch (FormatException)
            {
                MessageBox.Show("Định dạng nhập vào không phù hợp, mời bạn nhập lại !");
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }

        private void btReset_Click(object sender, EventArgs e)
        {
            dv = nvBAO.SelectViewAllNhanVien();
            for (int i = 0; i < dv.Table.Rows.Count; i++)
            {
                //dv.Table.Rows[i]["CapDo"] = "100";
                dv.Table.Rows[i]["Password"] = "**********";
            }

            dgvNhanVien.DataSource = dv;

            this.ResetAllControls();
            if (!SearchClicked)
            {
                dtNgayLV.Value = dtNgaySinh.Value = DateTime.Now;
                txtMaNV.Text = txtAccount.Text = AutoGenCode.GenNewCode("NhanVien");
                txtAccount.ReadOnly = txtMaNV.ReadOnly = true;
                txtPW.ReadOnly = false;
                btnReset.Enabled = btnAddNew.Enabled = btnSearch.Enabled = true;
            }
            else
            {
                dtNgayLV.Value = dtNgaySinh.Value = dtNgaySinh.MinDate;
                dtNLVDen.Value = dtNSDen.Value = dtNgaySinh.MaxDate;
                btnReset.Enabled = btnSearch.Enabled = true;
                btnDelete.Enabled = btnUpdate.Enabled = false;
            }
            this.Indexer();
        }


        private void btnUpdate_Click(object sender, EventArgs e)
        {
            NhanVien obj = InforToNhanVien();
            nvBAO.UpdateNhanVien(obj);
            btnReset.PerformClick();
        }

        private void btnDelete_Click(object sender, EventArgs e)
        {
            NhanVien obj = InforToNhanVien();
            nvBAO.DeleteNhanVien(obj);
            btnReset.PerformClick();
        }

        DataView dv;
        bool SearchClicked = false;
        private void btnSearch_Click(object sender, EventArgs e)
        {
            if (!SearchClicked)
            {

                SearchClicked = true;
                btnReset.PerformClick();

                btnSearch.BackgroundImage = (Image)(Properties.Resources.ResourceManager.GetObject("TatTK"));

                cboChucVu.Items.Add("Tat ca");
                CboGT.Items.Add("Tat ca");

                this.ResetAllControls();
                lblNLVDen.Visible = dtNLVDen.Visible = lblNSDen.Visible = dtNSDen.Visible = true;

                btnReset.Enabled = btnSearch.Enabled = true;
            }
            else
            {
                SearchClicked = false;
                btnReset.PerformClick();


                lblNLVDen.Visible = dtNLVDen.Visible = lblNSDen.Visible = dtNSDen.Visible = false;
                btnSearch.BackgroundImage = (Image)(Properties.Resources.ResourceManager.GetObject("BatTK"));
                cboChucVu.Items.Remove("Tat ca");
                CboGT.Items.Remove("Tat ca");
                //dtNgaySinh.Value = DateTime.Now;
            }

        }

        private void ResetAllControls()
        {
            txtAccount.Text = txtDiaChi.Text = txtHoDem.Text = txtLevel.Text = txtLuong.Text
                = txtMaNV.Text = txtNQL.Text = txtPW.Text = txtSDT.Text = txtTen.Text = "";
            txtAccount.ReadOnly = txtDiaChi.ReadOnly = txtHoDem.ReadOnly = txtLevel.ReadOnly = txtLuong.ReadOnly
                = txtMaNV.ReadOnly = txtNQL.ReadOnly = txtSDT.ReadOnly = txtTen.ReadOnly = false;
            txtPW.ReadOnly = true;

            btnAddNew.Enabled = btnDelete.Enabled = btnReset.Enabled = btnSearch.Enabled = btnUpdate.Enabled = false;
            cboChucVu.Text = CboGT.Text = "";
            dtNgayLV.Value = dtNgaySinh.Value = dtNgaySinh.MinDate;
            dtNLVDen.Value = dtNSDen.Value = dtNgaySinh.MaxDate;
        }


        private void Indexer()
        {
            for (int i = 0; i < dgvNhanVien.Rows.Count; i++)
                dgvNhanVien.Rows[i].Cells[0].Value = (i + 1);
        }

        List<string> listStringFilter = new List<string>();
        private void FilterChanged(object sender, EventArgs e)
        {
            if (SearchClicked)
            {
                //MessageBox.Show("Text changed");
                listStringFilter = new List<string>();

                //listStringFilter.Add(String.Format(" MaNV like '{0}%'", txtMaNV.Text));
                listStringFilter.Add(String.Format(" HoDemNV like '{0}%'", txtHoDem.Text));
                listStringFilter.Add(String.Format(" DiaChi like '{0}%'", txtDiaChi.Text));
                listStringFilter.Add(String.Format(" Convert(Luong,System.String) like '{0}%'", txtLuong.Text));
                listStringFilter.Add(String.Format(" MaNQL like '{0}%'", txtNQL.Text));
                listStringFilter.Add(String.Format(" MaNV like '{0}%'", txtMaNV.Text));
                listStringFilter.Add(String.Format(" SDT like '{0}%'", txtSDT.Text));
                listStringFilter.Add(String.Format(" TenNV like '{0}%'", txtTen.Text));
                listStringFilter.Add(String.Format("Convert(CapDo,System.String) like '{0}%'", txtLevel.Text));

                listStringFilter.Add(String.Format("(NgaySinh >= '{0}' and NgaySinh <= '{1}')", dtNgaySinh.Value, dtNSDen.Value));
                listStringFilter.Add(String.Format("(NgaylamViec >= '{0}' and NgayLamViec <= '{1}')", dtNgayLV.Value, dtNLVDen.Value));

                if (CboGT.Text != "Tat ca")
                    listStringFilter.Add(String.Format("GT like '{0}%'", CboGT.Text));
                else
                    listStringFilter.Add(String.Format("GT like '%'", CboGT.Text));
                if (cboChucVu.Text != "Tat ca")
                    listStringFilter.Add(String.Format("ChucVu like '{0}%'", cboChucVu.Text));
                else
                    listStringFilter.Add(String.Format("ChucVu like '%'", cboChucVu.Text));



                dv.RowFilter = ToStringFilter(listStringFilter);
                dgvNhanVien.DataSource = dv;
            }
        }
        private string ToStringFilter(List<string> list)
        {
            Console.WriteLine(list.Count.ToString());
            string s = "";
            if (list.Count >= 2)
                for (int i = 0; i < list.Count - 1; i++)
                    s += list.ToArray()[i] + " AND ";
            s += list.ToArray()[list.Count - 1];
            return s;
        }
    }
}
